package controller

import (
	"MessageSendService/app/api/internal/service"
	"MessageSendService/app/common"
	"MessageSendService/app/common/log"
	"MessageSendService/app/common/models"
	"MessageSendService/app/common/models/vo"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"net/http"
)

type Message struct {
}

// Send
// @Summary 发送一条消息。
// @Description  发送一条消息。
// @Tags APP 接口。
// @Accept json
// @Produce json
// @Param Body body vo.MessageRequest true "请求体"
// @Success 200 {object} common.Result
// @Router /message/send [post]
func (m Message) Send(c *gin.Context) {

	var req vo.MessageRequest
	err := c.BindJSON(&req)
	if err != nil {
		log.GetLogger().Error("参数错误", zap.Any("err", err))
		c.JSON(http.StatusBadRequest, common.Fail("参数错误"))
		return
	}
	log.GetLogger().Info("接收到请求：", zap.Any("请求", req))
	//构造发送请求结构体，调用责任链发送消息
	var batReq vo.BatchMessageRequest
	batReq.Code = req.Code
	batReq.MessageParamList = []models.MessageParam{req.MessageParam}
	batReq.MessageTemplateId = req.MessageTemplateId
	err = service.NewSendMessageService().SendMessage(batReq)
	if err != nil {
		log.GetLogger().Error("消息发送失败", zap.Any("err", err))
		c.JSON(http.StatusBadRequest, common.Fail(err.Error()))
		return
	}
	c.JSON(http.StatusOK, common.OkMsg("消息发送成功"))
}

// BatchSend
// @Summary 批量发送消息。
// @Description  批量发送消息。
// @Tags APP 接口。
// @Accept json
// @Produce json
// @Param Body body vo.BatchMessageRequest true "请求体"
// @Success 200 {object} common.Result
// @Router /message/batch_send [post]
func (m Message) BatchSend(c *gin.Context) {

	var req vo.BatchMessageRequest
	err := c.BindJSON(&req)
	if err != nil {
		log.GetLogger().Error("参数错误", zap.Any("err", err))
		c.JSON(http.StatusBadRequest, common.Fail("参数错误"))
		return
	}
	log.GetLogger().Info("接收到请求：", zap.Any("请求", req))
	//todo 调用责任链发送消息

	err = service.NewSendMessageService().SendMessage(req)
	if err != nil {
		log.GetLogger().Error("消息发送失败", zap.Any("err", err))
		c.JSON(http.StatusBadRequest, common.Fail(err.Error()))
		return
	}
	c.JSON(http.StatusOK, common.OkMsg("消息发送成功"))
}

func (m Message) Hello(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "Hello World",
	})
}
